package cn.tedu.csmall.order.webapi.service.impl;


import cn.tedu.csmall.cart.service.ICartService;
import cn.tedu.csmall.commons.exception.CoolSharkServiceException;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.commons.pojo.order.model.OrderTb;
import cn.tedu.csmall.commons.pojo.stock.dto.StockReduceCountDTO;
import cn.tedu.csmall.commons.restful.JsonResult;
import cn.tedu.csmall.commons.restful.ResponseCode;
import cn.tedu.csmall.order.service.IOrderService;
import cn.tedu.csmall.order.webapi.mapper.OrderMapper;
import cn.tedu.csmall.stock.service.IStockService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
//消费者和提供者可以同时出现在一个类中
@DubboService
@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {
    @Autowired
    private OrderMapper orderMapper;

//    @Autowired
//    private RestTemplate restTemplate;
// 当前order模块消费stock模块的减少库存的方法
// stock模块的减少库存的方法注册到nacos，所以当前order模块可以利用Dubbo调用
// 想要调用就必须使用@DubboReference,才能获得业务逻辑层实现类对象(有的公司要求dubbo的业务层变量名用dubbo)
    @DubboReference
    private IStockService stockService;

    @DubboReference
    private ICartService cartService;

    @Override
//    @GlobalTransactional
//    可以在远程调用其他服务之前在RM上面加上该注解开启远程调用
    public void orderAdd(OrderAddDTO orderAddDTO) {
        // 1.减少订单商品的库存数(要调用stock模块的方法)
        StockReduceCountDTO stockReduceCountDTO=new StockReduceCountDTO();
        stockReduceCountDTO.setCommodityCode(orderAddDTO.getCommodityCode());
        stockReduceCountDTO.setReduceCount(orderAddDTO.getCount());
//http://localhost:20003/base/stock/reduce/count  StockReduceCountDTO
        //第一个参数：要远程调用的模块的方法对应的路径
        //第二个参数：传入需要的参数
        //第三个参数：调用的方法返回值类型
//        restTemplate.postForObject(
//                "http://stock/base/stock/reduce/count",
//                stockReduceCountDTO,
//                JsonResult.class);
        stockService.reduceCommodityCount(stockReduceCountDTO);
        System.out.println("调用stock删除库存成功");
        // 2.删除订单中勾选的购物车中的商品(要调用cart模块的方法)
        cartService.deleteUserCart(orderAddDTO.getUserId()
                ,orderAddDTO.getCommodityCode());
        System.out.println("调用cart删除购物车成功");
        // 3.新增订单
        OrderTb order=new OrderTb();
        BeanUtils.copyProperties(orderAddDTO,order);
        // 执行新增
         int rows= orderMapper.insertOrder(order);
        if (rows==0){
            throw new CoolSharkServiceException(ResponseCode.INTERNAL_SERVER_ERROR,"新增订单失败");
        }
        log.info("新增的订单信息:{}",order);
    }
}
